const http = require("http");
const fs = require("fs");
const url = require("url")
const qs = require("querystring");

http.createServer((req, res) => {
    if (req.url.includes("/api")) {
        api(req, res);
    } else {
        static(req, res);
    }
}).listen(3000, () => {
    console.log("服务器开启成功，地址为：http://localhost:3000")
})

function api(req, res) {
    if (req.method === "GET") {
        const obj = url.parse(req.url, true).query;
        dataHandle(req, res, obj)
    } else if (req.method === "POST") {
        let str = ""
        req.on("data", (chunk) => {
            str += chunk;
        })
        req.on("end", () => {
            const obj = qs.parse(str);
            dataHandle(req, res, obj)
        })
    }
}

function dataHandle(req, res, reqData) {
    // 1. 设定接口功能
    switch (reqData.type) {
        case "register":
            register(req, res, reqData); break;
        case "login":
            login(req, res, reqData); break;
        case "getGoods":
            getGoods(req, res, reqData); break;
        case "detail":
            detail(req, res, reqData); break;
        default:
            error(req, res, reqData);
    }
}

// http://localhost:3000/api?type=register
function register(req, res, reqData) {
    // 注册功能：成功，重名失败
    // 先读用户信息
    fs.readFile("./databases/userMsg.json", "utf-8", (err, data) => {
        const userMsg = JSON.parse(data);
        // 判断是否存在重复用户名
        const flag = userMsg.some(val => val.username === reqData.username);
        if (flag) {
            // 存在，就注册失败
            // 为了保证成功和失败时，向前端返回信息的一致性，提前准备对象，内放置通用的属性名，对应的属性值
            const obj = {
                status: 0,
                title: "注册失败",
                userMsg: null
            }
            res.write(JSON.stringify(obj));
            res.end();
        } else {
            // 不存在，就增加本次用户信息
            userMsg.push({
                username: reqData.username,
                password: reqData.password
            })
            // 并写入原文件
            fs.writeFile("./databases/userMsg.json", JSON.stringify(userMsg), (err) => {
                // 为了保证成功和失败时，向前端返回信息的一致性，提前准备对象，内放置通用的属性名，对应的属性值
                const obj = {
                    status: 1,
                    title: "注册成功",
                    userMsg: {
                        username: reqData.username,
                        password: reqData.password
                    }
                }
                res.write(JSON.stringify(obj));
                res.end();
            })
        }
    })
}
// http://localhost:3000/api?type=login
function login(req, res, reqData) {
    // 登录功能
    // 先读用户信息
    fs.readFile("./databases/userMsg.json", "utf-8", (err, data) => {
        const userMsg = JSON.parse(data);
        // 判断是否存在重复用户名
        let i = 0;
        const flag = userMsg.some((val, idx) => {
            i = idx;
            return val.username === reqData.username;
        });
        const obj = {};
        if (flag) {
            // 存在，就继续判断密码
            if (userMsg[i].password === reqData.password) {
                // 密码相符，登录成功
                obj.status = 1;
                obj.title = "登录成功";
                obj.userMsg = {
                    username: reqData.username,
                    password: reqData.password,
                    token: Math.random()
                };
            } else {
                // 密码不符
                obj.status = 2;
                obj.title = "密码不符";
                obj.userMsg = null;
            }
        } else {
            // 不存在，直接返回用户名不存在
            // 为了保证成功和失败时，向前端返回信息的一致性，提前准备对象，内放置通用的属性名，对应的属性值
            obj.status = 0;
            obj.title = "用户名不存在";
            obj.userMsg = null;
        }
        res.write(JSON.stringify(obj));
        res.end();
    })
}

// http://localhost:3000/api?type=detail
function detail(req,res,reqData){
    fs.readFile("./static/data/goods.json", "utf-8", (err,data)=>{
        const arr = JSON.parse(data).msg;

        let i = 0;
        arr.some((val,idx)=>{
            i = idx;
            return val.proId === reqData.id;
        })

        res.write(JSON.stringify(arr[i]));
        res.end();
    })
}

// http://localhost:3000/api?type=getGoods
function getGoods(req,res,reqData){
    fs.readFile("./databases/goods.json", "utf-8", (err,data)=>{
        res.write(data);
        res.end();
    })
}

function error(req, res, reqData) {
    console.log("error");
    res.write("not function");
    res.end();
}

function static(req, res) {
    const p = url.parse(req.url).pathname;
    fs.readFile("./static" + p, (err, data) => {
        if (err) {
            res.write("not file");
        } else {
            res.write(data);
        }
        res.end();
    })
}
